ace.define(
  'ace/ext/linking',
  ['require', 'exports', 'module', 'ace/editor', 'ace/config'],
  function (require, exports, module) {
    var Editor = require('../editor').Editor;
    require('../config').defineOptions(Editor.prototype, 'editor', {
      enableLinking: {
        set: function (val) {
          if (val) {
            this.on('click', onClick);
            this.on('mousemove', onMouseMove);
          } else {
            this.off('click', onClick);
            this.off('mousemove', onMouseMove);
          }
        },
        value: false,
      },
    });
    exports.previousLinkingHover = false;
    function onMouseMove(e) {
      var editor = e.editor;
      var ctrl = e.getAccelKey();
      if (ctrl) {
        var editor = e.editor;
        var docPos = e.getDocumentPosition();
        var session = editor.session;
        var token = session.getTokenAt(docPos.row, docPos.column);
        if (exports.previousLinkingHover && exports.previousLinkingHover != token) {
          editor._emit('linkHoverOut');
        }
        editor._emit('linkHover', { position: docPos, token: token });
        exports.previousLinkingHover = token;
      } else if (exports.previousLinkingHover) {
        editor._emit('linkHoverOut');
        exports.previousLinkingHover = false;
      }
    }
    function onClick(e) {
      var ctrl = e.getAccelKey();
      var button = e.getButton();
      if (button == 0 && ctrl) {
        var editor = e.editor;
        var docPos = e.getDocumentPosition();
        var session = editor.session;
        var token = session.getTokenAt(docPos.row, docPos.column);
        editor._emit('linkClick', { position: docPos, token: token });
      }
    }
  },
);
(function () {
  ace.require(['ace/ext/linking'], function (m) {
    if (typeof module == 'object' && typeof exports == 'object' && module) {
      module.exports = m;
    }
  });
})();
